package com.lyrcsoft.beanfactorypostprocessor;

import com.lyrcsoft.service.OrderService;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.core.PriorityOrdered;

/**
 * @author fujc-dev@qq.com
 * @date 2023/7/11 17:34
 */
public class MyBeanDefinitionRegistryPostProcessor implements  BeanDefinitionRegistryPostProcessor {

	public  class  MyBean{

	}
	@Override
	public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
		//System.out.println("开发人员自己定义后置处理，可以在里面注入新的或者修改已存在BeanDefinition");
		// 该方法在所有Bean定义加载完成之后，Bean实例化之前被调用，允许开发人员对Bean定义进行自定义修改，
		// 例如添加，修改或删除Bean定义等。

		// 创建一个RootBeanDefinition实例，该实例对应的BeanClass是MyBean
		RootBeanDefinition beanDefinition = new RootBeanDefinition(MyBean.class);
		// 向BeanDefinitionRegistry注册MyBean的BeanDefinition
		registry.registerBeanDefinition("myBean", beanDefinition);

		// 查询和修改
		BeanDefinition myBean = registry.getBeanDefinition("myBean");
		System.out.println(myBean);
		// 删除
		registry.removeBeanDefinition("myBean");
	}


	@Override
	public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
		// 这个方法里面可以加工Bean
		// 我们可以拿到已存在的BeanDefinition进行修改等等
		//如： beanFactory.registerSingleton("111",new OrderService());
		//    beanFactory.getBeanDefinition("userService");
		//    String[] beanDefinitionNames = beanFactory.getBeanDefinitionNames();
		// 能拿到BeanFactory Spring里面的所有东西

		// 该方法是继承自BeanFactoryPostProcessor接口的方法，用于在BeanFactory完成实例化之后对BeanFactory进行后置处理。
		// 那么我们通过BeanDefinitionRegistryPostProcessor接口，开发人员可以在Spring容器启动时干预Bean的注册过程，从而实现对Bean的自定义处理。
	}
}
